'''
Created on 03/09/2013

@author: daniel
'''
import unittest
import colecciones.arbolGeneral
import colecciones.nodoGeneral#para el tesCase

class FuncionesDeArbolGeneral(colecciones.arbolGeneral.ArbolGeneral):
    
    def altura(self):
        if(self.getHijos().esVacia()):return 0
        i=0
        maxH=0
        while (i<self.getHijos().getTamanio()):
            cont=self.getHijos().elemento(i).altura()
            if(cont>maxH):maxH=cont
            i+=1
        return maxH+1
    
    def nivel(self, dato):
        if((self.getDatoRaiz()==dato)|(self.getHijos().esVacia())):return 0
        i=0
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).getDatoRaiz()==dato):
                return 1
            nivel=self.getHijos().elemento(i).nivel(dato)
            i+=1
            if(nivel!=0):return nivel+1
        return 0
  
    def ancho(self):
        if(self.getDatoRaiz()==None):return 0
        if(self.getHijos()==None):return 1
        i=0
        maxAn=self.getHijos().getTamanio()
        while (i<self.getHijos().getTamanio()):
            cont=self.getHijos().elemento(i).ancho()
            if(cont>maxAn):maxAn=cont
            cont=0
            i+=1
        return maxAn
    
    def esAncestro(self,datoPadre,datoHijo):
        rama=self.__esFamilia(datoPadre)
        resul=rama.__esFamilia(datoHijo)
        if(resul==None):return False
        return True
    
    def __esFamilia(self,dato):#devuelve la rama del dato
        if(self.getDatoRaiz()==dato):return self
        i=0
        if(self.getHijos()==None):return None
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).__esFamilia(dato)!=None):return self.getHijos().elemento(i)
            i+=1
        return None
        
    

class Test(unittest.TestCase):

    def testAltura(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        #print obj.altura()
        self.assertEquals(obj.altura(),3, "Verifica funcion altura")
        
    def testNivel(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(5))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(7))
            )
        obj.getHijos().elemento(1).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(9))
            )

        self.assertEquals(obj.nivel(4),0, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(3),1, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(2),2, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(5),2, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(1),3, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(100),0, "Verifica funcion nivel para inexistente")
        self.assertEquals(obj.nivel(7),1, "Verifica funcion nivel")
        self.assertEquals(obj.nivel(9),2, "Verifica funcion nivel")
        
    def testAncho(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3A"))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3B"))
            )
        obj.getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(2))
            )
        obj.getHijos().elemento(0).getHijos().elemento(0).agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(1))
            )
        self.assertEquals(obj.ancho(),3, "Verifica funcion ancho")
        
    def testEsAncestro(self):
        obj=FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(4))
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral(3))
            )
        obj.agregarHijo(
            FuncionesDeArbolGeneral(colecciones.nodoGeneral.NodoGeneral("3A"))
            )
        self.assertFalse(obj.esAncestro(3,"3A"), "Verifica hermandad")
        self.assertTrue(obj.esAncestro(4,3), "verifica padrazgo")       

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()